package com.zenith.middleware.service;

import com.zenith.common.result.PageResult;
import com.zenith.common.result.Result;
import com.zenith.middleware.po.dto.user.PermissionDTO;
import com.zenith.middleware.po.dto.user.RoleDTO;
import com.zenith.middleware.po.dto.user.RolePermissionDTO;
import com.zenith.middleware.po.dto.user.UserDTO;
import com.zenith.middleware.po.dto.user.UserRoleDTO;
import com.zenith.middleware.po.vo.user.PermissionVO;
import com.zenith.middleware.po.vo.user.RoleVO;
import com.zenith.middleware.po.vo.user.UserVO;
import com.zenith.middleware.po.vo.user.RolePermissionVO;
import com.zenith.middleware.po.vo.user.UserRoleVO;

import java.util.List;
import java.util.Set;

/**
 * 用户服务接口
 */
public interface UserService {
    
    /**
     * 检查用户是否是活跃状态
     */
    Result<Boolean> getUserActive(Long userId);

    /**
     * 获取当前用户信息接口
     */
    Result<Object> getCurrentUser(Long userId);

    // =========================== 用户管理相关接口 ===========================
    
    /**
     * 创建用户
     */
    Result<String> createUser(UserDTO userDTO);
    
    /**
     * 更新用户
     */
    Result<String> updateUser(UserDTO userDTO);
    
    /**
     * 删除用户
     */
    Result<String> deleteUser(Long id);
    
    /**
     * 获取用户详情
     */
    Result<UserVO> getUserById(Long id);
    
    /**
     * 按用户名查询
     */
    Result<UserVO> getUserByUsername(String username);
    
    /**
     * 分页查询用户
     */
    Result<PageResult<UserVO>> getUserPage(UserDTO query);
    
    /**
     * 批量查询用户
     */
    Result<List<UserVO>> getUsersByIds(List<Long> ids);
    
    /**
     * 更新用户状态
     */
    Result<String> updateUserStatus(Long id, Integer status);
    
    /**
     * 重置密码
     */
    Result<String> resetPassword(Long id, String newPassword);
    
    /**
     * 获取当前用户信息（新接口）
     */
    Result<UserVO> getCurrentUserInfo(Long userId);
    
    /**
     * 更新个人资料
     */
    Result<String> updateProfile(UserDTO userDTO);
    
    /**
     * 修改密码
     */
    Result<String> changePassword(Long userId, String oldPassword, String newPassword);
    
    /**
     * 上传头像
     */
    Result<String> uploadAvatar(Long userId, String avatarUrl);
    
    /**
     * 批量分配用户角色
     */
    Result<String> batchAssignRoles(List<Long> userIds, List<String> roleIds);
    
    /**
     * 批量删除用户（旧接口）
     */
    Result<Void> deleteUsers(List<String> ids);
    
    /**
     * 高级搜索用户
     */
    Result<PageResult<UserVO>> searchUsers(String keyword, Integer status, String role, Integer pageNum, Integer pageSize);

    // =========================== 权限管理相关接口 ===========================
    
    Result<PermissionVO> getPermissionById(String id);

    Result<List<PermissionVO>> getPermissionList();

    Result<PageResult<PermissionVO>> getPermissionPage(PermissionDTO query);

    Result<Boolean> getPermissionIds(Long userId, String requiredPermission);

    Result<List<PermissionVO>> selectPermissionsByRole(String role);

    // =========================== 角色管理相关接口 ===========================
    
    Result<RoleVO> getRoleById(String id);

    Result<List<RoleVO>> getRoleList();

    Result<PageResult<RoleVO>> getRolePage(RoleDTO query);

    Result<Void> updateRole(RoleVO entity);

    // =========================== 角色权限关联管理相关接口 ===========================
    
    Result<RolePermissionVO> getRolePermissionById(String id);

    Result<List<RolePermissionVO>> getRolePermissionList();

    Result<PageResult<RolePermissionVO>> getRolePermissionPage(RolePermissionDTO query);

    // =========================== 用户角色关联管理相关接口 ===========================
    
    Result<UserRoleVO> getUserRoleById(String id);

    Result<List<UserRoleVO>> getUserRoleList();

    Result<PageResult<UserRoleVO>> getUserRolePage(UserRoleDTO query);

    Result<Set<String>> getUserRoleIds(Long userId);

    Result<Set<String>> getUserPermissionIds(Long userId);
}